#ifndef _HEAD_H_
#define _HEAD_H_
#include "my_fun.h"

//----------------------------------------------------
#define CONFIG_MAX_LEN 256
//配置文件中要读取的数据的结构体
typedef struct {
    char log_path[CONFIG_MAX_LEN];
    char server_ip[CONFIG_MAX_LEN];
    char server_port[CONFIG_MAX_LEN];
    char data_base_user[CONFIG_MAX_LEN];
    char data_base_pwd[CONFIG_MAX_LEN];
    char data_base_name[CONFIG_MAX_LEN];
    int pthread_count;
}config;

int read_config(const char *file_name,config *config_info);

//----------------------------------------------------

//初始化日志
#define INIT_LOG(log_path) init_log(log_path)


//打印LOG宏函数
//参数一：日志等级，enum类型
//参数二：需要打印的字符信息
#define LOG(LEVEL,STR) write_log(LEVEL,STR,__FILE__,__FUNCTION__,__LINE__)



//默认打印日志等级                                                          
#define DEFAULT_LEVEL INFO
//日志等级
typedef enum {
    INFO,
    WARING,
    ERROR
}LOG_LEVEL;


//初始化日志
int init_log(const char * log_path);

//获取当前时间
void get_current_time(char* buf,ssize_t len);

//关闭日志文件
void close_log();

//写日志
void write_log(LOG_LEVEL level,const char * str,const char * file_name,const char * func,int line);

//---------------------------------------------------------------------------------------------------



typedef struct transmit_s{
   char flag[64];
   char name[64];
   char password[64];
   char command[64];
   char argument[64];
   char token[512];
}transmit_t;

int account(int* socket_fd,char *token, bool* is_connect);
//************** tcp相关函数 *************
int tcp_init(int *socket_fd, char *ip, char *port);

// ！！！！！！！这两个函数 只能 用来传递字符串 ！！！！！！！！
// 函数返回值是发送/接收到的字符个数
// recv_train 返回0说明对端关闭网络连接
int recv_train(char* buf, int net_fd);
int send_train(char* buf, int net_fd);

// ******************  epoll相关函数 ******************

int epoll_add(int epoll_fd, int fd);
int epoll_del(int epoll_fd, int fd);


// ************** 生产者消费者队列相关内容 *************

// 这个是队列中的数据域
typedef struct long_command_s{
    char command[64];        // 长命令
    char argument[64];       // 命令的参数
}long_command_t;

// 真实队列中的节点
typedef struct task_s{
    long_command_t long_command;
    struct task_s* next;
}task_t;

// 队列本身结构体
typedef struct task_queue_s{
    task_t* head;
    task_t* end;
    int size;
}task_queue_t;

int en_task_queue(task_queue_t* ptask_queue, long_command_t* plong_command);
int de_task_queue(task_queue_t* ptask_queue, long_command_t* plong_command);


// ***************** 线程相关内容 *********************

// 主线程和子线程的共享资源
typedef struct shared_resource_s{
    pthread_cond_t task_queue_cond;
    pthread_mutex_t task_queue_mutex;
    task_queue_t task_queue;
}shared_resource_t;

// TODO 需要写一个销毁函数，销毁锁，条件变量之类的
int shared_resource_init(shared_resource_t* p);

// 线程池相关
typedef struct pool_data_s{
    pthread_t* list;
    int num;
}pool_data_t;
// TODO　这里需要一个销毁函数，回收子线程资源和释放pool_data申请的堆空间
int pool_init(pool_data_t* pool_data, int num, shared_resource_t* p);


// 子线程主函数
void* thread_main(void* p);
// 子线程工作函数
int dowork(shared_resource_t* pshared_resource);

//******************* 客户端初始化相关 ****************
// 客户端初始化函数，有配置文件之后改这里
int client_init(config *config_info,shared_resource_t* pshared_resource, bool* is_connect,
                pool_data_t* pool_data, int* socket_fd);


//****************** 标准输入处理函数 *****************
int stdin_handler(int socket_fd, shared_resource_t* pshared_resource);

//****************** 网络处理函数 *****************
int socket_handler(int socket_fd, bool *is_connect, int epoll_fd);


//****************** 长命令处理函数 ***************

int puts_handler(int socket_fd, long_command_t long_command);
int gets_handler(int socket_fd, long_command_t long_command);


//*********************计算文件的hash值********************
int hash_sha1(char *file_hash, long_command_t long_command);
#endif
